package top.aoyudi.service.impl;

import org.apache.commons.io.FileUtils;
import org.apache.commons.io.FilenameUtils;
import top.aoyudi.entity.User;
import top.aoyudi.entity.UserFile;
import top.aoyudi.service.IFileService;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.*;


public class FileServiceImpl implements IFileService {

    /**
     * 指定默认主目录路径，自行指定
     */
    public static String HOME = "G:/file_system";

    /**
     * 主路径，请和HOME保持一致
     */
    private final String ROOT_HOME = "G:/file_system";

    /**
     * 文件列表
     */
    public List<UserFile> fileList = new ArrayList<>();

    /**
     * 输出菜单
     */
    public static void menu() {
        System.out.println("\t\t\t****功能菜单****");
        String menu = "1.打开文件夹\t" + "2.新建文件夹\t" + "3.新建文件\t" + "4.读文件\t\n" + "5.写文件\t" + "6.删除文件/文件夹\t" + "7.返回上一层目录\t" + "8.结束\t";
        System.out.println(menu);
    }

    /**
     * 当前目录下文件及文件夹
     */
    public void userHomeDir() {
        // 头部
        System.out.printf("\n\n%-20s\t\t\t%-15s\t\t%-5s\t\t%-1s%n", "名称", "修改日期", "类型", "大小");
        // 当前目录文件
        getAllFile();
        // 循环输出
        for (UserFile file : fileList) {
            System.out.println(file.toString());
        }
        // 换行
        System.out.println();
    }

    @Override
    public void getAllFile() {
        UserFile userFile = null;
        // 创建File对象
        File directory = new File(HOME);
        // 获取目录下的文件夹及文件
        File[] files = directory.listFiles();
        //时间格式化
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm");
        //遍历前进行清空
        fileList.clear();
        // 遍历文件夹及文件
        for (File file : files) {
            if (file.isDirectory()) {// 是文件夹
                userFile = new UserFile(file.getName(), sdf.format(file.lastModified()), "文件夹");
                fileList.add(userFile);
            } else {// 是文件
                userFile = new UserFile(file.getName(), sdf.format(file.lastModified()), "文本文档", file.length());
                fileList.add(userFile);
            }
        }
    }


    @Override
    public void addDir(String fileName) throws IOException {
        if (HOME.equals(ROOT_HOME) && User.activeUser.getUserRole().equals("20233333")) {
            System.out.println("你无权限在此处建立文件夹，请联系管理员");
            return;
        }
        if (isRepeat(fileName, "文件夹")) {
            File newFile = new File(HOME + "/" + fileName);
            FileUtils.forceMkdir(newFile);
            System.out.println("创建成功");
        } else {
            System.out.println("\n\n****存在同名文件夹****\n\n");
        }
    }

    @Override
    public void addFile(String fileName) {
        if (HOME.equals(ROOT_HOME) && User.activeUser.getUserRole().equals("20233333")) {
            System.out.println("你无权限在此处新建文件，请联系管理员");
            return;
        }
        if (isRepeat(fileName, "文本文档")) {
            try {
                File newFile = new File(HOME + "/" + fileName);
                System.out.print("****新建成功，请输入要存储的内容:");
                Scanner scanner = new Scanner(System.in);
                FileUtils.writeStringToFile(newFile, scanner.nextLine(), "UTF-8");
            } catch (IOException e) {
                System.out.println("新建文件出错");
            }
        } else {
            System.out.println("\n\n****存在同名文件****\n\n");
        }
    }

    @Override
    public void openDir(String dirName) {
        //普通用户只能访问自己的文件夹
        if (User.activeUser.getUserRole().equals("20233333")) {
            if (HOME.equals(ROOT_HOME) && !User.activeUser.getAccount().equals(dirName)) {
                System.out.println("\n\n****无权限进入****\n\n");
                return;
            }
        }
        for (UserFile userFile : fileList) {
            //当前目录有此文件夹
            if (userFile.getType().equals("文件夹") && userFile.getName().equals(dirName)) {
                HOME = HOME + "/" + dirName;
                return;
            }
        }
        System.out.println("\n\n****当前目录无此文件夹****\n\n");
    }

    @Override
    public void backDir() {
        if (HOME.equals(ROOT_HOME)) {
            System.out.println("\n\n****无法返回，您已经在根目录了****\n\n");
            return;
        }
        HOME = HOME.substring(0, HOME.lastIndexOf("/"));
    }

    @Override
    public void readFile(String fileName) throws IOException {
        boolean flag = false;
        // 创建File对象
        File directory = new File(HOME);
        // 获取目录下的文件夹及文件
        File[] files = directory.listFiles();
        String fileContent = null;
        for (File file : files) {
            if (file.getName().equals(fileName) && FilenameUtils.getExtension(fileName).equals("txt")) {
                fileContent = FileUtils.readFileToString(file, "UTF-8");
                flag = true;
            }
        }
        if (flag) {
            System.out.println(fileName + "长度:" + fileContent.length() + "，文件内容:\n\n" + fileContent + "\n\n");
        } else {
            System.out.println("\n\n****不支持的文件类型，或文件不存在****\n\n");
        }
    }

    @Override
    public void writeFile(String fileName, String fileContent, int type) {
        File outputFile = new File(HOME +"/"+ fileName);
        if (type == 0) {
            try {
                FileUtils.writeStringToFile(outputFile, "\n" + fileContent, "UTF-8", true);
            } catch (IOException e) {
                System.out.println("文件写入失败");
            }
        } else {
            try {
                FileUtils.writeStringToFile(outputFile, "\n" + fileContent, "UTF-8");
            } catch (IOException e) {
                System.out.println("文件写入失败");
            }
        }
    }

    @Override
    public void deleteFile(String fileName) throws IOException {
        if (HOME.equals(ROOT_HOME) && User.activeUser.getUserRole().equals("20233333")) {
            System.out.println("\n\n****用户无权限删除****\n\n");
            return;
        }
        // 创建File对象
        File directory = new File(HOME);
        // 获取目录下的文件夹及文件
        File[] files = directory.listFiles();
        for (File userFile : files) {
            if (userFile.getName().equals(fileName)) {
                FileUtils.forceDelete(userFile);
                System.out.println("\n\n****删除成功****\n\n");
                return;
            }
        }
        System.out.println("\n\n****文件/文件夹不存在****\n\n");
    }

    @Override
    public boolean isRepeat(String name, String type) {
        for (UserFile userFile : fileList) {
            if (userFile.getName().equals(name) && userFile.getType().equals(type)) {
                return false;
            }
        }
        return true;
    }
}
